/*****************************************************************************/
/*                                                                           */
/*    dosKernel - Domino Operation System Kernel Module                      */
/*                                                                           */
/*    Copyright (C) 2005 Laszlo Arvai                                        */
/*                                                                           */
/*    ------------------------------------------------------------------     */
/*    krnlMessageQueue.h - Message queue                                     */
/*****************************************************************************/
#ifndef __krnlMessageQueue_H
#define __krnlMessageQueue_H

///////////////////////////////////////////////////////////////////////////////
// Includes
#include "krnlTypes.h"
#include "sysCompiler.h"

///////////////////////////////////////////////////////////////////////////////
// Const
#define krnlDEFAULT_MESSAGE_TIME_TO_LIVE 10 // Message time to live in (unit=10ms)
#define krnlMESSAGE_DATA_LENGTH 8

///////////////////////////////////////////////////////////////////////////////
// Types

#include "sysPackStart.H"

// Message structure
struct _krnlMessage
{
  dosWord Id;
  
#ifdef ANONYMOUS_MEMBER_NOT_ALLOWED
	dosByte Data[krnlMESSAGE_DATA_LENGTH];
#else  
	union
	{
		dosByte Data[krnlMESSAGE_DATA_LENGTH];
		void* Pointer;
	};
#endif

  dosByte NextMessageIndex;
  dosByte TimeToLive;
};

#include "sysPackEnd.H"

typedef struct _krnlMessage krnlMessage;

//////////////////////////////////////////////////////////////////////////////
// Function prototypes
void krnlInitMessageQueue(void);
krnlMessage* krnlAllocateMessage(void);
krnlMessage* krnlAllocateAsyncMessage(void);
krnlMessage* krnlGetMessage(void);
void krnlPreprocessMessages( void );
void krnlRepostMessage(void);
dosBool krnlIsMessageReposted(void);
void krnlFreeMessage(void);

#endif
